package basics

import (
	"fmt"
	"strconv"
)

// ConvertNumericString 数值类型和字符串类型之间转换
func ConvertNumericString() {

	var num01 int32 = 65
	// 可以将整型强制转换, 但是会按照ASCII码表来转换
	// 但是不推荐这样使用
	var str01 string = string(num01)
	fmt.Println(str01)

	//var num02 float32 = 3.14
	//// 不能将其它基本类型强制转换为字符串类型
	//var str02 string = string(num02)
	//fmt.Println(str02)

	//var str03 string = "97"
	//// 不能强制转换, cannot convert str02 (type string) to type int
	//var num03 int = int(str03)
	//fmt.Println(num03)

	// 数值类型转字符串类型其它方式
	var num04 int32 = 110
	// Sprintf函数和Printf函数很像, 只不过不是输出而将格式化的字符串返回给我们
	var str04 string = fmt.Sprintf("%d", num04)
	fmt.Println(str04)
	var num05 float32 = 3.14
	var str05 string = fmt.Sprintf("%f", num05)
	fmt.Println(str05)
	var num06 bool = true
	var str06 string = fmt.Sprintf("%t", num06)
	fmt.Println(str06)

	var num1 int32 = 10
	// 第一个参数: 需要被转换的整型,必须是int64类型
	// 第二个参数: 转换为几进制, 必须在2到36之间
	// 将32位十进制整型变量10转换为字符串,并继续保留10进制格式
	str1 := strconv.FormatInt(int64(num1), 10)
	fmt.Println(str1) // 10

	// 将32位十进制整型变量10转换为字符串,并转换为2进制格式
	str2 := strconv.FormatInt(int64(num1), 2)
	fmt.Println(str2) // 1010

	var num5 float64 = 3.1234567890123456789
	// 第一个参数: 需要转换的实型, 必须是float64类型
	// 第二个参数: 转换为什么格式,f小数格式, e指数格式
	// 第三个参数: 转换之后保留多少位小数, 传入-1按照指定类型有效位保留
	//第四个参数: 被转换数据的实际位数,float32就传32, float64就传64
	//将float64位实型,按照小数格式并保留默认有效位转换为字符串
	str3 := strconv.FormatFloat(num5, 'f', -1, 64)
	fmt.Println(str3) // 3.1234567

	str4 := strconv.FormatFloat(num5, 'f', -1, 64)
	fmt.Println(str4) // 3.1234567890123457

	// 将float64位实型,按照小数格式并保留2位有效位转换为字符串
	str5 := strconv.FormatFloat(num5, 'f', 2, 64)
	fmt.Println(str5) // 3.12

	// 将float64位实型,按照指数格式并保留2位有效位转换为字符串
	str6 := strconv.FormatFloat(num5, 'e', 2, 64)
	fmt.Println(str6) // 3.12

	var num6 bool = true
	str7 := strconv.FormatBool(num6)
	fmt.Println(str7) // true

}
